package org.example.exchange;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;
import org.example.RabbitMQUtils;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 对应为producer下面的exchange.Producer01
 * @description: 交换机的消费者
 * @author: WangBlue
 * @create: 2023-11-29 20:05
 **/
public class Consumer01 {
    //交换机名称
    private static  final String EXCHANGE_NAME = "logs";

    public static void main(String[] args) throws IOException, TimeoutException {
        Channel channel = RabbitMQUtils.getChannel();
        //声明一个交换机
        // 交换机的名称，交换器的类型为：扇出（fanout)
        channel.exchangeDeclare(EXCHANGE_NAME,"fanout");
        //声明一个队列 临时队列
        /**
         * 生成一个临时的队列，队列的名称是随机的
         * 当消费者断开与队列的连接的时候 队列就自动删除
         */
        String queueName = channel.queueDeclare().getQueue();
        /**
         * 绑定交换机与队列,
         * 队列为：queueName,
         * 交换机：EXCHANGE_NAME， 路由键：为空
         */
        channel.queueBind(queueName,EXCHANGE_NAME,"");
        System.out.println("Consumer01等待接收消息，把接收到的消息打印在屏幕上...");
        //接收消息
        //消费者取消消息时回调接口
        DeliverCallback deliverCallback = (consumerTag, message) ->{
            System.out.println("Consumer01控制台打印接收到的消息:"+new String(message.getBody(),"UTF-8"));
        };

        /**
         * 消费者消费消息
         * 1.消费哪个队列
         * 2.消费成功之后是否要自动应答true：代表自动应答false:代表手动应答
         * 3.消费者未成功消费的回调
         * 4.消费者取消消费的回调
         */

        // 值得一提的是，basicConsume 的参数中，第三个和第四个参数都是接口，所以需要实现该接口的方法
        channel.basicConsume(queueName,true,deliverCallback,consumerTag -> {});
    }


}
